// Copyright 2025 祝灵福
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and

import { TypeOrmModuleOptions } from '@nestjs/typeorm'
// import { Logs } from './src/logs/logs.entity'
// import { Roles } from './src/roles/roles.entity'
// import { Profile } from './src/user/profile.entity'
// import { User } from './src/user/user.entity'
import { DataSource, DataSourceOptions } from 'typeorm'
// 怎么在ormconfig.ts这个文件里去对接不同的环境下的配置文件：dotenv库
import * as fs from 'fs'
import * as dotenv from 'dotenv'
import { ConfigEnum } from './src/enum/config.enum'
// 1.通过环境变量读取不同的.env文件
function getEnv(env: string): Record<string, unknown> {
  //fs.existsSync 是Node.js模块（fs）中的一个同步方法，用于检查指定路径的文件或目录是否存在，存在：true
  if (fs.existsSync(env)) {
    //fs.readFileSync(env): 同步读取指定路径（由 env 提供）的文件内容。
    //dotenv.parse:是 dotenv 库提供的一个方法，用于解析.env 文件的内容,会将这些键值对转换为一个js对象。
    return dotenv.parse(fs.readFileSync(env))
  }
  return {}
}

//根据不同的环境（开发、生产等）动态加载并合并相应的配置文件，以确保应用程序在不同的环境下能够获得正确的配置
export function getServicerConfig() {
  const defaultConfig = getEnv('.env') //获取默认配置
  const envConfig = getEnv(`.env.${process.env.NODE_ENV || 'development'}`) //获取环境特定配置：
  // configService
  const config = { ...defaultConfig, ...envConfig } //合并配置
  return config
}
// 2.通过dotenv来解析不同的配置:设置连接选项
function buildConnectionOptions() {
  const defaultConfig = getEnv('.env')
  const envConfig = getEnv(`.env.${process.env.NODE_ENV || 'development'}`)
  //   把上面两个配置进行合并: 使用扩展运算符=> 后面的envConfig就可以去覆盖defaultCofig了
  //   此时config等同于configService
  const config = { ...defaultConfig, ...envConfig }
  const logFlag = config['LOG_ON'] === 'true'
  const entitiesDir =
    process.env.NODE_ENV === 'test'
      ? [__dirname + '/**/*.entity.ts']
      : [__dirname + '/**/*.entity{.js,.ts}']

  return {
    type: config[ConfigEnum.db_TYPE],
    host: config[ConfigEnum.db_HOST],
    port: config[ConfigEnum.db_PORT],
    username: config[ConfigEnum.db_USERNAME],
    password: config[ConfigEnum.db_PASSWORD],
    database: config[ConfigEnum.db_DATABASE],
    // 实体类，实体对象，创建数据库表
    entities: entitiesDir,
    // entities: [Teacher, Score, Student],
    // 同步本地的schema与数据库 => 初始化的时候使用
    synchronize: config[ConfigEnum.db_SYNC],
    // 日志等级
    // logging: true//建议在开发环境用
    logging: logFlag && process.env.NODE_ENV === 'development' ? ['error'] : [] //限制在开发环境用
    // logging: ['error']
    // logging: false
  } as TypeOrmModuleOptions
}
// 连接参数
export const connectionParams = buildConnectionOptions()
export default new DataSource({
  ...connectionParams,
  migrations: ['src/migrations/**'],
  subscribers: []
} as DataSourceOptions)
